﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SisVenda.Business;
using SisVenda.Data;
using System.Data;
using System.Collections;
using System.Reflection;
using Froggy.Data;
using SisVenda.Web.messageBox;
using SisVenda.Web.Code;

namespace SisVenda.Web.Vendedor.Fn
{
    [System.ComponentModel.DataObject(true)]
    public class VendaFn
    {

        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public DataTable obterVendaID(int idVenda)
        {
            #region SQL
            string sql = @"SELECT v.IdVenda, c.IdPessoa as IdCliente, c.Nome as Cliente, c.CPF,
	                            c.CNPJ, c.RG,c.InscricaoEstadual, c.TipoPessoa, v.CategoriaVenda_IdCategoriaVenda AS IdCategoriaVenda, cv.Descricao AS CategoriaVenda, 
	                            COUNT(par.Venda_idVenda) as QtdParcelas, SUM(par.ValorParcela) / COUNT(par.Venda_idVenda) as ValorParcela, v.ValorTotal
                            FROM Venda v
                            INNER JOIN Pessoa c
	                            ON c.IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Parcela par
	                            ON par.Venda_IdVenda = v.IdVenda
                            INNER JOIN CategoriaVenda AS cv 
	                            ON cv.IdCategoriaVenda = v.CategoriaVenda_IdCategoriaVenda
                            WHERE v.IdVEnda = @idVenda
                            GROUP BY v.IdVenda, c.IdPessoa, c.Nome, c.CPF,
	                        c.CNPJ, c.RG,c.InscricaoEstadual, c.TipoPessoa, v.CategoriaVenda_IdCategoriaVenda, cv.Descricao, v.ValorTotal";
            #endregion
            DbCommandUtil db = new DbCommandUtil(sql);
            db.AddParameter("@idVenda", DbType.Int32, idVenda);
            return db.GetDataTable();
        }

        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public DataTable ObterVenda(string tipoConsulta, string parametroPesquisa, string situacaoVenda)
        {
            string sql = null;
            string parPes = parametroPesquisa;
            parametroPesquisa = "%" + parPes + "%";
            string sitCon = situacaoVenda;
            situacaoVenda = "%" + sitCon + "%";
            string tipCon = "%" + tipoConsulta + "%";
            tipoConsulta = tipCon;

            if (tipoConsulta.Equals("%NOME_CLIENTE%"))
            {
                if (situacaoVenda.Equals("%TODAS%"))
                {
                    #region SQL
                    sql = @"SELECT v.IdVenda, pc.Nome AS Cliente, v.valorTotal, v.DataVenda, v.Situacao,pv.Nome AS Vendedor, v.TotalComissao 
                        FROM Venda v
                        INNER JOIN Cliente c
	                        ON c.Pessoa_IdPessoa = v.Cliente_Pessoa_IdPessoa
                        INNER JOIN Funcionario f
	                        ON f.Pessoa_IdPessoa = v.Funcionario_Pessoa_IdPessoa
                        INNER JOIN Pessoa pc
	                        ON pc.IdPessoa = v.Cliente_Pessoa_IdPessoa
                        INNER JOIN Pessoa pv 
	                        ON pv.IdPessoa = v.Funcionario_Pessoa_IdPessoa
                        INNER JOIN ItemVenda iv
	                        ON iv.Venda_IdVenda = v.IdVenda
                        INNER JOIN Produto pro
	                        ON pro.IdProduto = iv.Produto_IdProduto
                        WHERE pc.Nome LIKE @parametroPesquisa
                        ORDER BY pc.Nome
                        ";
                    #endregion
                }
                else
                {
                    #region SQL
                    sql = @"SELECT v.IdVenda, pc.Nome AS Cliente, v.valorTotal, v.DataVenda, v.Situacao,pv.Nome AS Vendedor, v.TotalComissao 
                        FROM Venda v
                        INNER JOIN Cliente c
	                        ON c.Pessoa_IdPessoa = v.Cliente_Pessoa_IdPessoa
                        INNER JOIN Funcionario f
	                        ON f.Pessoa_IdPessoa = v.Funcionario_Pessoa_IdPessoa
                        INNER JOIN Pessoa pc
	                        ON pc.IdPessoa = v.Cliente_Pessoa_IdPessoa
                        INNER JOIN Pessoa pv 
	                        ON pv.IdPessoa = v.Funcionario_Pessoa_IdPessoa
                        INNER JOIN ItemVenda iv
	                        ON iv.Venda_IdVenda = v.IdVenda
                        INNER JOIN Produto pro
	                        ON pro.IdProduto = iv.Produto_IdProduto
                        WHERE pc.Nome LIKE @parametroPesquisa AND v.Situacao LIKE @situacaoVenda
                        ORDER BY pc.Nome
                        ";
                    #endregion
                }
            }
            if (tipoConsulta.Equals("%CPF_CLIENTE%"))
            {
                if (situacaoVenda.Equals("%TODAS%"))
                {
                    #region SQL
                    sql = @"SELECT v.IdVenda, pc.Nome AS Cliente, v.valorTotal, v.DataVenda, v.Situacao,pv.Nome AS Vendedor, v.TotalComissao 
                            FROM Venda v
                            INNER JOIN Cliente c
	                            ON c.Pessoa_IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Funcionario f
	                            ON f.Pessoa_IdPessoa = v.Funcionario_Pessoa_IdPessoa
                            INNER JOIN Pessoa pc
	                            ON pc.IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Pessoa pv 
	                            ON pv.IdPessoa = v.Funcionario_Pessoa_IdPessoa
                            INNER JOIN ItemVenda iv
	                            ON iv.Venda_IdVenda = v.IdVenda
                            INNER JOIN Produto pro
	                            ON pro.IdProduto = iv.Produto_IdProduto
                            WHERE pc.CPF LIKE @parametroPesquisa
                            ORDER BY pc.Nome
                         ";
                    #endregion
                }
                else
                {
                    #region SQL
                    sql = @"SELECT v.IdVenda, pc.Nome AS Cliente, v.valorTotal, v.DataVenda, v.Situacao,pv.Nome AS Vendedor, v.TotalComissao 
                        FROM Venda v
                        INNER JOIN Cliente c
	                        ON c.Pessoa_IdPessoa = v.Cliente_Pessoa_IdPessoa
                        INNER JOIN Funcionario f
	                        ON f.Pessoa_IdPessoa = v.Funcionario_Pessoa_IdPessoa
                        INNER JOIN Pessoa pc
	                        ON pc.IdPessoa = v.Cliente_Pessoa_IdPessoa
                        INNER JOIN Pessoa pv 
	                        ON pv.IdPessoa = v.Funcionario_Pessoa_IdPessoa
                        INNER JOIN ItemVenda iv
	                        ON iv.Venda_IdVenda = v.IdVenda
                        INNER JOIN Produto pro
	                        ON pro.IdProduto = iv.Produto_IdProduto
                        WHERE pc.CPF LIKE @parametroPesquisa AND v.Situacao LIKE @situacaoVenda
                        ORDER BY pc.Nome
                        ";
                    #endregion
                }
            }

            if (tipoConsulta.Equals("%CNPJ_CLIENTE%"))
            {
                if (situacaoVenda.Equals("%TODAS%"))
                {
                    #region SQL
                    sql = @"SELECT v.IdVenda, pc.Nome AS Cliente, v.valorTotal, v.DataVenda, v.Situacao,pv.Nome AS Vendedor, v.TotalComissao 
                            FROM Venda v
                            INNER JOIN Cliente c
	                            ON c.Pessoa_IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Funcionario f
	                            ON f.Pessoa_IdPessoa = v.Funcionario_Pessoa_IdPessoa
                            INNER JOIN Pessoa pc
	                            ON pc.IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Pessoa pv 
	                            ON pv.IdPessoa = v.Funcionario_Pessoa_IdPessoa
                            INNER JOIN ItemVenda iv
	                            ON iv.Venda_IdVenda = v.IdVenda
                            INNER JOIN Produto pro
	                            ON pro.IdProduto = iv.Produto_IdProduto
                            WHERE pc.CNPJ LIKE @parametroPesquisa
                            ORDER BY pc.Nome
                         ";
                    #endregion
                }
                else
                {
                    #region SQL
                    sql = @"SELECT v.IdVenda, pc.Nome AS Cliente, v.valorTotal, v.DataVenda, v.Situacao,pv.Nome AS Vendedor, v.TotalComissao 
                        FROM Venda v
                        INNER JOIN Cliente c
	                        ON c.Pessoa_IdPessoa = v.Cliente_Pessoa_IdPessoa
                        INNER JOIN Funcionario f
	                        ON f.Pessoa_IdPessoa = v.Funcionario_Pessoa_IdPessoa
                        INNER JOIN Pessoa pc
	                        ON pc.IdPessoa = v.Cliente_Pessoa_IdPessoa
                        INNER JOIN Pessoa pv 
	                        ON pv.IdPessoa = v.Funcionario_Pessoa_IdPessoa
                        INNER JOIN ItemVenda iv
	                        ON iv.Venda_IdVenda = v.IdVenda
                        INNER JOIN Produto pro
	                        ON pro.IdProduto = iv.Produto_IdProduto
                        WHERE pc.CNPJ LIKE @parametroPesquisa AND v.Situacao LIKE @situacaoVenda
                        ORDER BY pc.Nome
                        ";
                    #endregion
                }
            }
            if (tipoConsulta.Equals("%NOME_VENDEDOR%"))
            {
                if (situacaoVenda.Equals("%TODAS%"))
                {
                    #region SQL
                    sql = @"SELECT v.IdVenda, pc.Nome AS Cliente, v.valorTotal, v.DataVenda, v.Situacao,pv.Nome AS Vendedor, v.TotalComissao 
                            FROM Venda v
                            INNER JOIN Cliente c
	                            ON c.Pessoa_IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Funcionario f
	                            ON f.Pessoa_IdPessoa = v.Funcionario_Pessoa_IdPessoa
                            INNER JOIN Pessoa pc
	                            ON pc.IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Pessoa pv 
	                            ON pv.IdPessoa = v.Funcionario_Pessoa_IdPessoa
                            INNER JOIN ItemVenda iv
	                            ON iv.Venda_IdVenda = v.IdVenda
                            INNER JOIN Produto pro
	                            ON pro.IdProduto = iv.Produto_IdProduto
                            WHERE pv.CPF LIKE @parametroPesquisa
                            ORDER BY pc.Nome
                         ";
                    #endregion
                }
                else
                {
                    #region SQL
                    sql = @"SELECT v.IdVenda, pc.Nome AS Cliente, v.valorTotal, v.DataVenda, v.Situacao,pv.Nome AS Vendedor, v.TotalComissao 
                            FROM Venda v
                            INNER JOIN Cliente c
	                            ON c.Pessoa_IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Funcionario f
	                            ON f.Pessoa_IdPessoa = v.Funcionario_Pessoa_IdPessoa
                            INNER JOIN Pessoa pc
	                            ON pc.IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Pessoa pv 
	                            ON pv.IdPessoa = v.Funcionario_Pessoa_IdPessoa
                            INNER JOIN ItemVenda iv
	                            ON iv.Venda_IdVenda = v.IdVenda
                            INNER JOIN Produto pro
	                            ON pro.IdProduto = iv.Produto_IdProduto
                            WHERE pv.CPF LIKE @parametroPesquisa AND v.Situacao LIKE @situacaoVenda
                            ORDER BY pc.Nome
                         ";
                    #endregion
                }
            }
            if (tipoConsulta.Equals("%DESCRICAO_PRODUTO%"))
            {
                if (situacaoVenda.Equals("%TODAS%"))
                {
                    #region SQL
                    sql = @"SELECT v.IdVenda, pc.Nome AS Cliente, v.valorTotal, v.DataVenda, v.Situacao,pv.Nome AS Vendedor, v.TotalComissao 
                            FROM Venda v
                            INNER JOIN Cliente c
	                            ON c.Pessoa_IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Funcionario f
	                            ON f.Pessoa_IdPessoa = v.Funcionario_Pessoa_IdPessoa
                            INNER JOIN Pessoa pc
	                            ON pc.IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Pessoa pv 
	                            ON pv.IdPessoa = v.Funcionario_Pessoa_IdPessoa
                            INNER JOIN ItemVenda iv
	                            ON iv.Venda_IdVenda = v.IdVenda
                            INNER JOIN Produto pro
	                            ON pro.IdProduto = iv.Produto_IdProduto
                            WHERE pv.CPF LIKE @parametroPesquisa
                            ORDER BY pc.Nome
                         ";
                    #endregion
                }
                else
                {
                    #region SQL
                    sql = @"SELECT v.IdVenda, pc.Nome AS Cliente, v.valorTotal, v.DataVenda, v.Situacao,pv.Nome AS Vendedor, v.TotalComissao 
                            FROM Venda v
                            INNER JOIN Cliente c
	                            ON c.Pessoa_IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Funcionario f
	                            ON f.Pessoa_IdPessoa = v.Funcionario_Pessoa_IdPessoa
                            INNER JOIN Pessoa pc
	                            ON pc.IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Pessoa pv 
	                            ON pv.IdPessoa = v.Funcionario_Pessoa_IdPessoa
                            INNER JOIN ItemVenda iv
	                            ON iv.Venda_IdVenda = v.IdVenda
                            INNER JOIN Produto pro
	                            ON pro.IdProduto = iv.Produto_IdProduto
                            WHERE pv.CPF LIKE @parametroPesquisa AND v.Situacao LIKE @situacaoVenda
                            ORDER BY pc.Nome 
                         ";
                    #endregion
                }
            }
            if (tipoConsulta.Equals("%%"))
            {
                #region SQL
                sql = @"SELECT v.IdVenda, pc.Nome AS Cliente, v.valorTotal, v.DataVenda, v.Situacao,pv.Nome AS Vendedor, v.TotalComissao 
                            FROM Venda v
                            INNER JOIN Cliente c
	                            ON c.Pessoa_IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Funcionario f
	                            ON f.Pessoa_IdPessoa = v.Funcionario_Pessoa_IdPessoa
                            INNER JOIN Pessoa pc
	                            ON pc.IdPessoa = v.Cliente_Pessoa_IdPessoa
                            INNER JOIN Pessoa pv 
	                            ON pv.IdPessoa = v.Funcionario_Pessoa_IdPessoa
                            INNER JOIN ItemVenda iv
	                            ON iv.Venda_IdVenda = v.IdVenda
                            INNER JOIN Produto pro
	                            ON pro.IdProduto = iv.Produto_IdProduto
                            WHERE pc.Nome LIKE @parametroPesquisa
                            ORDER BY pc.Nome 
                         ";
                #endregion
            }


            DbCommandUtil db = new DbCommandUtil(sql);
            if (!situacaoVenda.Equals("%TODAS%") && !tipoConsulta.Equals("%%"))
            {
                db.AddParameter("@parametroPesquisa", DbType.String, parametroPesquisa);
                db.AddParameter("@situacaoVenda", DbType.String, situacaoVenda);
            }
            else
            {
                db.AddParameter("@parametroPesquisa", DbType.String, parametroPesquisa);
            }
            return db.GetDataTable();
        }

        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public DataTable ObterItensVenda(int idVenda)
        {
            #region SQL
            string sql = @"SELECT p.IdProduto, p.Descricao, p.Unidade, i.Quantidade, i.Preco, i.ValorComissao, SUM(i.quantidade * i.preco) as Valor 
                                FROM Produto p
                                INNER JOIN ItemVenda i
                                    ON p.IdProduto = i.Produto_IdProduto
                                INNER JOIN Venda c
                                    ON c.IdVenda = i.Venda_IdVenda
                                WHERE c.IdVenda = @idvenda 
                                GROUP BY c.IdVenda, p.IdProduto, p.Descricao, p.Unidade, i.Quantidade, i.preco, i.ValorComissao
                                ORDER BY p.Descricao";
            #endregion
            DbCommandUtil db = new DbCommandUtil(sql);
            db.AddParameter("@idVenda", DbType.Int32, idVenda);
            return db.GetDataTable();
        }

        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public DataTable ObterFormaPagamento(int idVenda)
        {
            #region SQL
            string sql = @"SELECT NumeroParcela, ValorParcela, DataVencimento, ValorComissao, SituacaoParcela
                            FROM Parcela AS p
                            WHERE (Venda_IdVenda = @idVenda)
                            GROUP BY NumeroParcela, ValorParcela, DataVencimento, ValorComissao, SituacaoParcela
                            ORDER BY NumeroParcela";
            #endregion
            DbCommandUtil db = new DbCommandUtil(sql);
            db.AddParameter("@idVenda", DbType.Int32, idVenda);
            return db.GetDataTable();
        }

        public DataTable RetornarDataTable(IQueryable pObjQuery)
        {
            DataTable _dt = new DataTable();

            //Cria o DataTable
            foreach (var item in pObjQuery)
            {
                Type t = item.GetType();
                PropertyInfo[] properties = t.GetProperties();
                for (int i = 0; i < properties.Length; i++)
                {
                    _dt.Columns.Add(properties[i].Name);
                }
                break;
            }

            IEnumerator en = (IEnumerator)pObjQuery.GetEnumerator();

            //Popula o DataTable
            while (en.MoveNext())
            {
                Type ten = en.Current.GetType();
                PropertyInfo[] propertiesen = ten.GetProperties();
                DataRow _dtrow = _dt.NewRow();
                for (int i = 0; i < propertiesen.Length; i++)
                {
                    object obj = propertiesen[i].GetValue(en.Current, new object[] { });
                    _dtrow[i] = obj;
                }
                _dt.Rows.Add(_dtrow);
            }

            return _dt;
        }

        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Insert)]
        public Int32 InserirVenda(Int32 idVendedor, Int32 idCliente, Int32 idCategoriaVenda)
        {
            VendaBo vendas = new VendaBo();
            Venda venda = new Venda();
            venda.Funcionario_Pessoa_IdPessoa = idVendedor;
            venda.Cliente_Pessoa_IdPessoa = idCliente;
            venda.CategoriaVenda_IdCategoriaVenda = idCategoriaVenda;
            venda.ValorTotal = (decimal)0.00;
            venda.TotalComissao = (decimal)0.00;

            CategoriaVenda pCategoriaVenda = ObterObjetoCategoriaVenda();

            if (pCategoriaVenda != null)
            {
                venda.CategoriaVenda_IdCategoriaVenda = pCategoriaVenda.IdCategoriaVenda;
            }
            else
            {
                MessageBox.Show("Erro ao realizar operação!\nNão existe nenhuma categoria de venda cadastra no sistema.", MessageBox.MessageType.Error);
                return -1;
            }

            venda.DataVenda = DateTime.Now;
            venda.ValorTotal = 0;
            venda.TotalComissao = 0;
            vendas.Add(venda);


            try
            {
                vendas.SaveChanges();
                MessageBox.Show("Venda incluida, agora informe os itens da venda... ", MessageBox.MessageType.Success);
                return venda.IdVenda;
            }
            catch
            {
                MessageBox.Show("Erro ao realizar operação!", MessageBox.MessageType.Error);
                return -1;
            }
        }

        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Insert)]
        public Int32 InserirItemVenda(Int32 idProduto, Int32 idVenda, Int32 quantidade)
        {
            ItemVendaBO itemVendas = new ItemVendaBO();
            ItemVenda itemVenda = new ItemVenda();

            itemVenda.Produto_IdProduto = idProduto;
            itemVenda.Venda_IdVenda = idVenda;
            itemVenda.Quantidade = quantidade;
            itemVenda.Preco = ObterObjetoProduto(idProduto).Preco;


            itemVenda.ValorComissao = CalcularComissaoItemVenda(ObterObjetoProduto(idProduto).CategoriaProduto.Comissao, quantidade, (Decimal)itemVenda.Preco);

            bool sucesso = DecrementarEstoqueProduto(idProduto, quantidade);
            if (sucesso)
            {
                itemVendas.Add(itemVenda);

                VendaBo pVendas = new VendaBo();
                Venda pVenda = new Venda();

                pVenda = pVendas.Find(pVend => pVend.IdVenda == idVenda).First<Venda>();

                pVenda.ValorTotal = pVenda.ValorTotal + (itemVenda.Quantidade * itemVenda.Preco);
                pVenda.TotalComissao = pVenda.TotalComissao + itemVenda.ValorComissao;



                pVendas.Update(pVenda);

                try
                {
                    pVendas.SaveChanges();
                    itemVendas.SaveChanges();
                    MessageBox.Show("Item incluido com sucesso!", MessageBox.MessageType.Success);
                    return itemVenda.Venda_IdVenda;
                }
                catch
                {
                    IncrementarEstoqueProduto(idProduto, quantidade);
                    MessageBox.Show("Erro ao realizar operação!", MessageBox.MessageType.Error);
                    return itemVenda.Venda_IdVenda;
                }
            }
            else
            {
                MessageBox.Show("Operação não permitida!", MessageBox.MessageType.Warning);
                return itemVenda.Venda_IdVenda;
            }
        }

        public bool InserirParcela(Int32 idVenda, Int32 numeroParcelas, decimal valorParcela)
        {
            DateTime dataVencimento = DateTime.Now.AddMonths(1);

            Venda pVenda= ObterObjetoVenda(idVenda);
            decimal valorComissaoParcela = (decimal) pVenda.TotalComissao / numeroParcelas;

            for (int i = 1; i <= numeroParcelas; i++)
            {
                ParcelaBo parcelas = new ParcelaBo();
                Parcela parcela = new Parcela();

                parcela.Venda_IdVenda = idVenda;
                parcela.NumeroParcela = i;
                parcela.ValorParcela = valorParcela;
                parcela.DataVencimento = dataVencimento;
                parcela.SituacaoComissao = "A VENCER";
                parcela.SituacaoParcela = "A VENCER";
                parcela.ValorComissao = valorComissaoParcela;

                parcelas.Add(parcela);
                try
                {
                    parcelas.SaveChanges();
                }
                catch
                {
                    MessageBox.Show("Erro ao realizar operação!", MessageBox.MessageType.Error);
                    return false;
                }
                dataVencimento = dataVencimento.AddMonths(1);
            }
            MessageBox.Show("Operção realizada com sucesso!", MessageBox.MessageType.Success);
            return true;
        }

        private decimal CalcularComissaoItemVenda(decimal valorComissao, int quantidade, decimal preco)
        {
            return (valorComissao / 100 * (quantidade * preco));

        }

        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Delete)]
        public Boolean DeleteItemVenda(Int32 idVenda, Int32 idProduto)
        {
            ItemVendaBO itemVendas = new ItemVendaBO();
            ItemVenda itemVenda = new ItemVenda();

            itemVenda = itemVendas.Find(iv => iv.Venda_IdVenda == idVenda && iv.Produto_IdProduto == idProduto).First<ItemVenda>();

            bool incrementou = IncrementarEstoqueProduto(idProduto, (int)itemVenda.Quantidade);

            if (incrementou)
            {
                VendaBo pVendas = new VendaBo();
                Venda pVenda = new Venda();

                pVenda = pVendas.Find(pVend => pVend.IdVenda == idVenda).First<Venda>();

                pVenda.ValorTotal = pVenda.ValorTotal - (itemVenda.Quantidade * itemVenda.Preco);
                pVenda.TotalComissao = pVenda.TotalComissao - itemVenda.ValorComissao;

                itemVendas.Delete(itemVenda);
                pVendas.Update(pVenda);
                try
                {
                    pVendas.SaveChanges();
                    itemVendas.SaveChanges();
                    MessageBox.Show("Item de venda excluido com sucesso!", MessageBox.MessageType.Success);
                    return true;
                }
                catch
                {
                    MessageBox.Show("Operação não permitida!", MessageBox.MessageType.Warning);
                    return false;
                }
            }
            else
            {
                MessageBox.Show("Operação não permitida!!", MessageBox.MessageType.Warning);
                return false;
            }
        }

        public ArrayList NumeroParcelasMaximo(string tipoVenda, decimal valorVenda)
        {
            ArrayList numeroParcelas = new ArrayList();
            if (tipoVenda.Contains("PRAZO"))
            {
                decimal valorParcelaMinima = 1000;
                for (int i = 12; i >= 1; i--)
                {
                    if (valorVenda / i >= valorParcelaMinima)
                    {
                        for (int j = 1; j <= i; j++)
                        {
                            numeroParcelas.Add(j);
                        }
                        return numeroParcelas;
                    }
                    if (i <= 2)
                    {
                        valorParcelaMinima = valorParcelaMinima - 50;
                    }
                    else
                        valorParcelaMinima = valorParcelaMinima - 100;
                    if (valorParcelaMinima == 0)
                        i = 1;
                }
            }

            numeroParcelas.Add(1);
            return numeroParcelas;
        }

        public decimal CalcularValorParcela(decimal valorVenda, Int32 numeroParcelas)
        {
            return valorVenda / numeroParcelas;
        }

        public Produto ObterObjetoProduto(int idProduto)
        {
            ProdutoBo pProdutos = new ProdutoBo();
            Produto pProduto = new Produto();

            pProduto = pProdutos.Find(pProdut => pProdut.IdProduto == idProduto).First<Produto>();
            return pProduto;
        }

        public Venda ObterObjetoVenda(int idVenda)
        {
            VendaBo pVendas = new VendaBo();
            Venda pVenda = new Venda();

            pVenda = pVendas.Find(pVend => pVend.IdVenda == idVenda).First<Venda>();
            return pVenda;
        }

        public Pessoa ObterObjetoPessoa(int idPessoa)
        {
            PessoaBo pPessoas = new PessoaBo();
            Pessoa pPessoa = new Pessoa();

            pPessoa = pPessoas.Find(pPes => pPes.IdPessoa == idPessoa).First<Pessoa>();
            return pPessoa;
        }

        public CategoriaVenda ObterObjetoCategoriaVenda()
        {
            CategoriaVendaBo pCatVendas = new CategoriaVendaBo();
            CategoriaVenda pcateVenda = new CategoriaVenda();

            pcateVenda = pCatVendas.Find(pCatV => pCatV.IdCategoriaVenda == pCatV.IdCategoriaVenda).First<CategoriaVenda>();
            return pcateVenda;
        }


        public Boolean DecrementarEstoqueProduto(Int32 idProduto, Int32 quantidade)
        {
            ProdutoBo produtos = new ProdutoBo();
            Produto produto = new Produto();

            produto = produtos.Find(pro => pro.IdProduto == idProduto).First<Produto>();

            if (produto.Estoque >= quantidade)
            {
                produto.Estoque = produto.Estoque - quantidade;
                produtos.Update(produto);
                try
                {
                    produtos.SaveChanges();
                    return true;
                }
                catch
                {
                    MessageBox.Show("Operação não permitida, estoque de produto insuficiente!", MessageBox.MessageType.Warning);
                    return false;
                }
            }
            else
            {
                MessageBox.Show("Operação não permitida, estoque de produto insuficiente!", MessageBox.MessageType.Warning);
                return false;
            }
        }

        public Boolean IncrementarEstoqueProduto(Int32 idProduto, Int32 estoque)
        {
            ProdutoBo produtos = new ProdutoBo();
            Produto produto = new Produto();

            produto = produtos.Find(pro => pro.IdProduto == idProduto).First<Produto>();

            produto.Estoque = produto.Estoque + estoque;
            produtos.Update(produto);
            try
            {
                produtos.SaveChanges();
                return true;
            }
            catch
            {
                MessageBox.Show("Erro ao adicionar item ao estoque!", MessageBox.MessageType.Error);
                return false;
            }
        }
    }
}